Problem
采药人的路径
Description
采药人的药田是一个树状结构,每条路径上都种植着同种药材。
采药人以自己对药材独到的见解,对每种药材进行了分类。大致分为两类,一种是阴性的,一种是阳性的。
采药人每天都要进行采药活动。他选择的路径是很有讲究的,他认为阴阳平衡是很重要的,所以他走的一定是两种药材数目相等的路径。
采药工作是很辛苦的,所以他希望他选出的路径中有一个可以作为休息站的节点(不包括起点和终点),满足起点到休息站和休息站到终点的路径也是阴阳平衡的。
他想知道他一共可以选择多少种不同的路径。
Input
第行包含一个整数。
接下来行,每行包含三个整数,表示到这条路上药材的类型为。
Output
Sample Input
1 | 7 |
Sample Output
1 | 1 |
HINT
对于的数据,。
标签:点分治
Solution
点分治基础题。
每次找重心作分治中心,同一子树内的路径数递归计算,只考虑经过当前分治中心的路径数。
对于当前分治中心,处理出其余未分治到的点与其的路径上有多少阴性和阳性道路。设阴性道路边权为,阳性为,那么若两个点到分治中心的路径拼起来可以构成一条合法道路,一定需要满足两个条件:
- 路径总长为
- 在两条路径中一定有至少一条在路径上存在两个点,使得分治中心到这个两点的长度相同,并且这个长度不为。特殊情况是两条路径的长度都为也可。
用表示现在枚举到的子树中,与当前分治中心距离为的路径上有/没有两个离分治中心距离相同的点的路径条数;用表示同样的意义,只是是在前面已枚举的子树中这样的路径条数。那么从当前子树和前面的子树各选一条路径,拼成新路径,这样对答案的贡献是。除此之外还需要加上两条不同子树中到分治中心长为的路径组成的路径条数,即。
点分时每次预处理,统计即可。
Code
1 |
|